package Leetcode第二期;

/**
 * @author : K k
 * @date : 11:26 2020/9/22
 * 实现获取下一个排列的函数，算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
 *
 * 如果不存在下一个更大的排列，则将数字重新排列成最小的排列（即升序排列）。
 *
 * 必须原地修改，只允许使用额外常数空间。
 *
 * 以下是一些例子，输入位于左侧列，其相应输出位于右侧列。
 * 1,2,3 → 1,3,2
 * 3,2,1 → 1,2,3
 * 1,1,5 → 1,5,1
 */
public class 下一个排列_31 {

    //思路：寻找逆序对,并将降序数组逆置
    public void nextPermutation(int[] nums) {
        if(nums.length==0){return;}
        int i=nums.length-2;
        while(i>=0){
            if(nums[i+1]<=nums[i]){
                i--;
            }else{
                break;
            }
        }
        if(i>=0){
            int j=nums.length-1;
            while(j>i){
                if(nums[j]>nums[i]){
                    swap(nums,i,j);
                    break;
                }else{
                    j--;
                }
            }
        }

        reverseList(nums,i+1);
    }

    public void swap(int[] nums,int i,int j){
        int tmp=nums[i];
        nums[i]=nums[j];
        nums[j]=tmp;
    }
    public void reverseList(int[] nums,int start){
        int i = start, j = nums.length - 1;
        while (i < j) {
            swap(nums, i, j);
            i++;
            j--;
        }
    }
}
